//
// Created by jwhww on 25-9-25.
//

#include "AllHeadFile.h"
//该文件没有对应头文件

//------------------------------------------------------------------------------------------------------
// 函数简介		中断函数大全
// 备注信息       等我一会儿让GPT给我全写出来
//------------------------------------------------------------------------------------------------------
/* ================================== Cortex 核心 ================================== */
// SysTick
void HAL_SYSTICK_Callback(void) {}                                           //系统时基中断回调

/* ================================== GPIO (EXTI) ================================== */
// void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {}                        //最常用，GPIO外部中断

/* ================================== TIM ================================== */
static uint16_t i = 0;
uint16_t monitor_target_position = 0;    //测试用变量

float temp_torque_m1 = 0.0f;
int16_t temp_speed_m1 = 0;

int temp_position_m3 = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM6) {
        //Key按键检测
        Key_Check_All();
    //------------------------------------多电机步骤------------------------------------
        //闭环计算
        int16_t tmp_closeCircle[8] = {0};   //8电机缓存区
        // tmp_closeCircle[0] = JJ_motor_speed_closeCircle(200, &Struct_Pid_GM6020[0].NORMAL, MOTOR_1);
        // tmp_closeCircle[0] = JJ_motor_P_S_closeCircle(monitor_target_position,&Struct_Pid_GM6020[0].POSITION, &Struct_Pid_GM6020[0].SPEED, MOTOR_1);
        // tmp_closeCircle[0] = JJ_motor_P_T_closeCircle(monitor_target_position, &Struct_Pid_GM6020[0].POSITION, &Struct_Pid_GM6020[0].TORQUE, MOTOR_1);
        //底座1号电机
        if (dbus_ctrl_data.channel.s1 == 1) {   //单力矩环
            temp_torque_m1 = -((float)dbus_ctrl_data.channel.CH[0] - 1024.f) * 1.818f; // 1.818 = 1200 / (1684 - 1024)
            tmp_closeCircle[0] = JJ_motor_torque_closeCircle(temp_torque_m1, &Struct_Pid_GM6020[0].TORQUE, MOTOR_1);
        }
        if (dbus_ctrl_data.channel.s1 == 2) {   //速度串力矩
            temp_speed_m1 = (int16_t)(-((float)dbus_ctrl_data.channel.CH[0] - 1024.f) * 0.2f);
            tmp_closeCircle[0] = JJ_motor_S_T_closeCircle(temp_speed_m1, &Struct_Pid_GM6020[0].SPEED, &Struct_Pid_GM6020[0].TORQUE, MOTOR_1);
        }
        //脑袋3号电机
        if (dbus_ctrl_data.channel.s2 == 1) {   //单位置环
            //死区
            float temp_ch1 = (float)dbus_ctrl_data.channel.CH[1];
            if (temp_ch1 >= 1019.f && temp_ch1 <= 1029.f) temp_ch1 = 1024.f;
            //换算
            temp_position_m3 = (int)((float)monitor_target_position                                                                                                         - (temp_ch1 - 1024.f) * (6.206f / 4.f)); // 6.206 = 4096 / (1684 - 1024)
            if (temp_position_m3 > 8191) temp_position_m3 -= 8192;
            if (temp_position_m3 < 0) temp_position_m3 += 8192;
            tmp_closeCircle[2] = JJ_motor_position_closeCircle(temp_position_m3, &Struct_Pid_GM6020[2].NORMAL, MOTOR_3);
        }
        if (dbus_ctrl_data.channel.s2 == 2) {   //单位置串速度
            temp_position_m3 = (int)((float)monitor_target_position - ((float)dbus_ctrl_data.channel.CH[1] - 1024.f) * 6.206f);
            if (temp_position_m3 > 8191) temp_position_m3 -= 8192;
            if (temp_position_m3 < 0) temp_position_m3 += 8192;
            //固定角度
            tmp_closeCircle[2] = JJ_motor_P_S_closeCircle(temp_position_m3, &Struct_Pid_GM6020[2].POSITION, &Struct_Pid_GM6020[2].SPEED, MOTOR_3);
        }
        // tmp_closeCircle[0] = JJ_motor_MIT_closeCircle(500, monitor_target_position, 0, MOTOR_1);
        // tmp_closeCircle[2] = JJ_motor_position_closeCircle(6143, &Struct_Pid_GM6020[2].NORMAL, MOTOR_3);
        // tmp_closeCircle[2] = JJ_motor_P_S_closeCircle(monitor_target_position,&Struct_Pid_GM6020[2].POSITION, &Struct_Pid_GM6020[2].SPEED, MOTOR_3);
        //装载
        JJ_motor_data_load(MOTOR_1, tmp_closeCircle[0]);
        // JJ_motor_data_load(MOTOR_2, tmp_output[1]);
        JJ_motor_data_load(MOTOR_3, tmp_closeCircle[2]);
        // JJ_motor_data_load(MOTOR_4, tmp_output[3]);
        //发报
        JJ_motor_ctrl(&hcan1, MOTOR_TYPE_GM6020, MOTOR_GROUP_1234_CURRENT);
    //------------------------------------多电机步骤------------------------------------
        //工作闪绿灯
        if (i == 0)
            HAL_GPIO_TogglePin(LED_Green_GPIO_Port, LED_Green_Pin);
        i++;
        i %= 10;    //分频系数i，10 * TIM6周期 = 闪烁半周期
    }
}          //最常用，定时器周期中断
// void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) {}        //输出比较延迟事件
// void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {}             //输入捕获完成中断，用于测脉宽
// void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {}      //pwm脉冲结束中断
// void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) {}                //触发事件中断
// void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) {}                  //出错中断，调试用
// 如果用 DMA:
// void HAL_TIMEx_DMAHalfCpltCallback(DMA_HandleTypeDef *hdma) {}          //DMA半传输完成
// void HAL_TIMEx_DMAErrorCallback(DMA_HandleTypeDef *hdma) {}             //DMA错误中断

/* ================================== UART/USART ================================== */
// void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {}               //发送中断
// void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) {}           //发送半完成
// void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {}               //最常用，接收完成中断，配合HAL_UART_Receive_IT使用
// void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) {}           //接收半完成
// void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {}                //串口异常中断
// void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) {}            //中止完成
// void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) {}    //发送中止完成
// void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) {}     //接收中止完成

/* ================= I2C ================= */
// void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) {}               //主机发送完成
// void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) {}               //主机接受完成
// void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) {}                //从机发送完成
// void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {}                //从机接收完成
// void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) {}                  //内存写完成
// void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) {}                  //内存读完成
// void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) {}                      //最常用，出错中断
// void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) {}                  //中止完成

/* ================================== SPI ================================== */
// void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) {}                      //发送完成
// void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) {}                  //发送半完成
// void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) {}                      //接收完成
// void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) {}                  //接收半完成
// void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) {}                   //收发完成中断
// void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) {}               //收发半完成
// void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {}                      //错误中断
// void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) {}                  //中止完成

/* ================================== CAN ================================== */
// void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) {}         //发送邮箱0完成
// void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) {}         //发送邮箱1完成
// void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) {}         //发送邮箱2完成
// void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) {}            //发送邮箱0中止
// void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) {}            //发送邮箱1中止
// void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) {}            //发送邮箱2中止
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
    if (hcan->Instance == CAN1) {
        //收豹纹
        JJ_motor_data_receive(&hcan1);
    }
}          //最常用，接收FIFO0有新报文中断
// void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) {}          //同上，FIFO1
// void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan) {}                //接收队列满了中断
// void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan) {}                //FIFO1满
// void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) {}                      //错误中断
// void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan) {}                      //进入睡眠
// void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) {}            //从接收唤醒

/* ================================== ADC ================================== */
// void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {}                   //最常用，单次ADC转换完成中断
// void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc) {}               //半缓冲中断
// void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc) {}           //模拟量越界中断
// void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc) {}                      //错误中断

/* ================================== DMA ================================== */
// void HAL_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma) {}                   //最常用，传输完成
// void HAL_DMA_XferHalfCpltCallback(DMA_HandleTypeDef *hdma) {}               //半传输完成
// void HAL_DMA_ErrorCallback(DMA_HandleTypeDef *hdma) {}                      //错误中断
// void HAL_DMA_AbortCpltCallback(DMA_HandleTypeDef *hdma) {}                  //传输中止完成

// /* ================================== RTC ================================== */
// void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {}                //闹钟A事件
// void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc) {}              //闹钟B事件
// void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) {}         //唤醒定时器事件
// void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc) {}             //篡改检测事件
// void HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef *hrtc) {}           //时间戳事件
//
// /* ================================== USB OTG ================================== */
// void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) {}                 //USB SETUP阶段
// void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) {} //USB OUT数据阶段
// void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) {}  //USB IN数据阶段
// void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) {}                        //USB帧开始
// void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) {}                      //USB复位
// void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) {}                    //USB挂起
// void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) {}                     //USB恢复
// void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) {} //ISO OUT不完整
// void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) {}  //ISO IN不完整
// void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) {}                    //USB连接
// void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) {}                 //USB断开
//
// /* ================================== ETH 以太网 ================================== */
// void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth) {}                     //以太网发送完成
// void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) {}                     //以太网接收完成
// void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth) {}                      //以太网错误
//
// /* ================================== FSMC/FMC ================================== */
// void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand) {}                       //NAND去初始化
// void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef *hsram) {}                       //SRAM去初始化
// 具体读写完成回调 STM32F4 HAL 支持有限，需要结合 DMA 才会有 Cplt 回调
